import { } from './constent'

/**
 * @description 防抖函数
 * @param func 需要添加防抖的函数
 * @param delay 防抖间隔时间 - ms
 * @returns () => void
 */
export function debounce(func: (this: any) => void, delay: number): () => void {
  let timer
  return function (this: any) {
    if (timer) {
      clearTimeout(timer)
    }
    let args: any = arguments
    timer = setTimeout(() => {
      func.apply(this, args)
    }, delay)
  }
}

/**
 * 
 * @param options 需要验证的参数
 * @param deep 是否需要深层次验证
 * @returns 
 */
export function validatorNull(options: string | number | object, deep: boolean = false) {
  if (options instanceof String && options == '') {
    return {
      errorCode: '0000',
      message: '参数验证未通过, String类型数据不允许为""'
    }
  } else if (options instanceof Number && !options) {
    return {
      errorCode: '0000',
      message: '参数验证未通过, Number类型不允许为 0'
    }
  } else if (options instanceof Object) {
    if (Array.isArray(options) && options.length == 0) {
      return {
        errorCode: '0000',
        message: '参数验证未通过, Array数据类型不允许为空数组'
      }
    } else if (typeof options == 'function') {
      return {
        errorCode: '0000',
        message: '参数验证未通过, Function数据类型不予判断'
      }
    } else {
      // object 类型
      for (const key in options) {
        if (deep) {
          if (options[key] instanceof Object) {
            return validatorNull(options[key], true)
          }
        }
        if (options[key] == '' || options[key] == null) {
          return {
            errorCode: '0000',
            message: `参数验证未通过, ${key}不允许为空`
          }
        }
      }
      if (JSON.stringify(options) == '{}') {
        return {
          errorCode: '0000',
          message: '参数验证未通过, Object数据类型不允许为空'
        }
      }
    }
  }

  return {
    errorCode: '0',
    message: '参数验证"空"通过'
  }
}
